package com.demo.gateway.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.security.Key;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JwtTokenProvider {

    @Value("${jwt.secret}")
    private String secretKey;

    @Value("${jwt.expiration}")
    private long expiration;

    // 生成签名密钥（基于 secretKey）
    private Key getSigningKey() {
        // 解码 Base64 密钥
        byte[] keyBytes = Base64.getDecoder().decode(secretKey);
        // 验证密钥长度是否符合 HS256 要求（256 位）
        return Keys.hmacShaKeyFor(keyBytes);
    }
    public static void main(String[] args) {
        // 生成 HS512 算法要求的 512 位（64 字节）密钥
        Key key = Keys.secretKeyFor(SignatureAlgorithm.HS512);
        // 转换为 Base64 字符串，方便存储在配置文件中
        String base64Key = Base64.getEncoder().encodeToString(key.getEncoded());
        System.out.println("HS512 密钥（512 位，Base64 编码）：       " + base64Key);
    }
    /**
     * 生成 Token
     * @param username 用户名
     * @param roles 角色列表（如 ["ROLE_USER"]）
     */
    public String generateToken(String username, String password, String... roles) {
        Date now = new Date();
        Date expirationDate = new Date(now.getTime() + expiration);

        // 自定义载荷（可添加用户角色、权限等信息）
        Map<String, Object> claims = new HashMap<>();
        claims.put("roles", roles);
        claims.put("username", username);
        claims.put("password", password);

        return Jwts.builder()
                .setClaims(claims)
                .setSubject(username)  // 用户名作为主题
                .setIssuedAt(now)      // 签发时间
                .setExpiration(expirationDate)  // 过期时间
                .signWith(getSigningKey(), SignatureAlgorithm.HS512)  // 签名算法
                .compact();
    }

    /**
     * 从 Token 中获取用户名
     */
    public String getUsername(String token) {
        return getClaims(token).getSubject();
    }
    /**
     * 从 Token 中获取用户名
     */
    public String getPassword(String token) {
        return (String) getClaims(token).get("password");
    }

    /**
     * 验证 Token 是否有效
     */
    public boolean validateToken(String token) {
        try {
            Claims claims = getClaims(token);
            return !claims.getExpiration().before(new Date());  // 未过期则有效
        } catch (Exception e) {
            return false;  // 解析失败或过期均视为无效
        }
    }

    /**
     * 解析 Token 中的载荷
     */
    private Claims getClaims(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(getSigningKey())
                .build()
                .parseClaimsJws(token)
                .getBody();
    }
}